#ifndef __BSP_SOFT_PWM_H
#define __BSP_SOFT_PWM_H
#include "main.h"
#include "stdint.h"

// #warning "根据需求修改"
#define SOFT_PWM_MAX_NUM 5                          // 软PWM最大数量
#define PWM_LED_GPIO LED_RUN_GPIO_Port, LED_RUN_Pin // 放到APP层（这里只是为了调试方便）

#define BSP_SET_HIGH(gpio, pin) LL_GPIO_SetOutputPin(gpio, pin)  // 高电平
#define BSP_SET_LOW(gpio, pin) LL_GPIO_ResetOutputPin(gpio, pin) // 低电平
#define BSP_GET_READ(gpio, pin) LL_GPIO_IsInputPinSet(gpio, pin) // 读取引脚状态

typedef enum
{
  sp_STOP, // 关闭
  sp_RUN,  // 打开
} softPwm;

typedef struct
{
  uint32_t sp_nowTim;
  uint32_t sp_agoTim;
  GPIO_TypeDef *sp_GPIOx;
  uint32_t sp_Pin;
} softPwm_bsp;

typedef struct
{
  softPwm sp_State;     // 状态
  uint32_t sp_Cycle_ms; // 周期
  uint32_t sp_Hz;       // 频率
  uint8_t sp_Pulse;     // 占空比 %
  softPwm_bsp sp_Mcu;   // MCU硬件相关配置
} soft_PWM_t;

void bsp_softPwm_Obj_New(soft_PWM_t *obj, GPIO_TypeDef *gpio, uint32_t pin, uint32_t cycle, uint8_t pulse, softPwm state);
void bsp_softPwm_Set_Pulse(soft_PWM_t *obj, uint8_t pulse);
void bsp_softPwm_Set_Cycle(soft_PWM_t *obj, uint8_t cycle);
void bsp_softPwm_RUN(soft_PWM_t *obj);
void bsp_softPwm_STOP(soft_PWM_t *obj);
softPwm bsp_Get_softPwm_State(soft_PWM_t *obj);

// #ERRORt "请参考  《移   植  工  作  STM32G0》"
void bsp_softPwm_IRQHandler(void);
void bsp_soft_PWM_All_Handle(void);
void bsp_softPwm_Debug(void);

#endif

/************************************* 移   植  工  作  STM32G0 ************************************************/

#if 0
放到main.c文件中定时器初始化部分
LL_TIM_EnableCounter(TIMx);   // 使能计数
LL_TIM_EnableIT_UPDATE(TIMx); // 使能更新中断
LL_TIM_EnableAllOutputs(TIMx);
#endif

#if 0
放在定时器中断中
  if (LL_TIM_IsActiveFlag_UPDATE(TIMx) == SET)
  {
    bsp_softPwm_IRQHandler();//放到1ms中断中
  }
  LL_TIM_ClearFlag_UPDATE(TIMx); // 清除中断标志位

  main.c主循环中
  bsp_soft_PWM_All_Handle();
#endif
/*****************************************************************************************************/
